// 逆波兰表达式,也称为后缀表达式
// 由于计算机无法和人类一样处理括号表达式的优先级,所以波兰的科学家发明出了一种运算符号挨着两个运算数后,并且根据优先级排序符号的表达式
// 更多信息请自己搜寻,这里仅仅讲解解题思路
// 由于逆波兰表达式符号的特点,我们可以通过栈这一个结构来处理表达式
// 让计算机读取vector,当不是符号的时候,就将数字按照顺序压栈
// 当读取到符号之后,就将最近压入栈的两个数字出栈,运算之后然后把结果再压入栈
// 当遍历完成了之后,栈有且只有最后一个值,而且这个值是最后的结果

class Solution {
public:
    int evalRPN(vector<string>& tokens) 
    {

        stack<int> ret ;

        int n = tokens.size () ;

        for (int i = 0 ; i < n ; i++)
        {

            string& e = tokens [i] ;

            if (isNumber (e)) 
            {

                ret.push (atoi (e.c_str ())) ;
                
            }

            else
            {

                int i2 = ret.top () ; // 注意值顺序,会导致运算结果出错

                ret.pop () ;
                
                int i1 = ret.top () ;

                ret.pop () ;

                switch (e [0])
                {

                    case '+' :

                        ret.push (i1 + i2) ;

                        break ;

                    case '-' :

                        ret.push (i1 - i2) ;

                        break ;

                    case '*' :

                        ret.push (i1 * i2) ;

                        break ;

                    case '/' :

                        ret.push (i1 / i2) ;

                        break ;
                    
                }
                
            }

        }

        return ret.top () ;
        
    }

    bool isNumber (string& e)
    {

        return !(e == "+" || e == "-" || e == "*" || e == "/") ;

    }

} ;